package br.com.petsis.funcionalidades.consultarComissoes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Pedido;
import br.com.petsis.entity.PedidoProduto;
import br.com.petsis.entity.PedidoServico;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.Produto;
import br.com.petsis.entity.Servico;
import br.com.petsis.vo.ConsultaPedidosVO;

@Name("consultarComissoesController")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class ConsultarComissoesController {
	
	@In(create=true)
	private EntityManager entityManager;
	
	private Date dtaInicio;
	
	private Date dtaFim;
	
	private boolean checkBanho;
	
	private boolean checkTosa;
	
	private float valorComissao;
	
	private float valorTotal;
	
	private float valorTotalComissao;
	
	private List<PedidoServico> listaPedidos;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	public void pesquisar(){
		if(empresaSessao == null){
			return;
		}
		StringBuffer query = new StringBuffer();
		if(checkBanho && checkTosa){
			query.append("select ps from PedidoServico ps where ps.pedido.empresa.idEmpresa = :idEmpresa and ps.pedido.flgPago = 'T' and (UPPER(ps.servico.dscNome) like ('%BANHO%') or UPPER(ps.servico.dscNome) like ('%TOSA%'))");
		}else if(checkBanho){
			query.append("select ps from PedidoServico ps where ps.pedido.empresa.idEmpresa = :idEmpresa and ps.pedido.flgPago = 'T' and UPPER(ps.servico.dscNome) like ('%BANHO%')");
		}else if(checkTosa){
			query.append("select ps from PedidoServico ps where ps.pedido.empresa.idEmpresa = :idEmpresa and ps.pedido.flgPago = 'T' and UPPER(ps.servico.dscNome) like ('%TOSA%')");
		}else{
			FacesMessages.instance().add(Severity.ERROR,"Selecione ao menos um tipo de comissão");
			return;
		}
		query.append(" and ps.pedido.dtaPedido >= :dtaInicio and ps.pedido.dtaPedido <= :dtaFim ");
		listaPedidos = entityManager.createQuery(query.toString())
			.setParameter("dtaInicio", getDtaInicio())
			.setParameter("dtaFim", getDtaFim())
			.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
			.getResultList();
		if(getListaPedidos().size() == 0){
			FacesMessages.instance().add(Severity.ERROR,"Nenhum registro encontrado.");
		}else{
			valorTotalComissao = 0F;
			valorTotal = 0F;
			List<PedidoServico> listaRemocao = new ArrayList<PedidoServico>();
			for(PedidoServico ps : getListaPedidos()){
				if(ps.getFlgComissao() == null || ps.getFlgComissao()){
					ps.setVlrComissao(ps.getVlrServico() * (getValorComissao() / 100));
					valorTotalComissao += ps.getVlrComissao();
					valorTotal += ps.getVlrServico();
				}else{
					listaRemocao.add(ps);
				}
			}
			getListaPedidos().removeAll(listaRemocao);
		}
	}

	public float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(float valorTotal) {
		this.valorTotal = valorTotal;
	}

	public List<PedidoServico> getListaPedidos() {
		if (listaPedidos == null) {
			listaPedidos = new ArrayList<PedidoServico>();
		}
		return listaPedidos;
	}

	public void setListaPedidos(List<PedidoServico> listaPedidos) {
		this.listaPedidos = listaPedidos;
	}

	public Date getDtaInicio() {
		return dtaInicio;
	}

	public void setDtaInicio(Date dtaInicio) {
		this.dtaInicio = dtaInicio;
	}

	public Date getDtaFim() {
		return dtaFim;
	}

	public void setDtaFim(Date dtaFim) {
		this.dtaFim = dtaFim;
	}

	public boolean isCheckBanho() {
		return checkBanho;
	}

	public void setCheckBanho(boolean checkBanho) {
		this.checkBanho = checkBanho;
	}

	public boolean isCheckTosa() {
		return checkTosa;
	}

	public void setCheckTosa(boolean checkTosa) {
		this.checkTosa = checkTosa;
	}

	public float getValorComissao() {
		return valorComissao;
	}

	public void setValorComissao(float valorComissao) {
		this.valorComissao = valorComissao;
	}

	public float getValorTotalComissao() {
		return valorTotalComissao;
	}

	public void setValorTotalComissao(float valorTotalComissao) {
		this.valorTotalComissao = valorTotalComissao;
	}
	
}
